home *** CD-ROM | disk | FTP | other *** search
/ Visual Basic Graphics Programming (2nd Edition) / Visual Basic Graphics Programming 2nd Edition.iso / Src / Ch10 / Chaos.frm < prev    next >
Text File  |  1999-06-08  |  5KB  |  217 lines

  1. VERSION 5.00
  2. Object = "{F9043C88-F6F2-101A-A3C9-08002B2F49FB}#1.2#0"; "COMDLG32.OCX"
  3. Begin VB.Form frmChaos 
  4.    Caption         =   "Chaos"
  5.    ClientHeight    =   4335
  6.    ClientLeft      =   2280
  7.    ClientTop       =   1185
  8.    ClientWidth     =   5310
  9.    LinkTopic       =   "Form1"
  10.    PaletteMode     =   1  'UseZOrder
  11.    ScaleHeight     =   4335
  12.    ScaleWidth      =   5310
  13.    Begin MSComDlg.CommonDialog dlgFile 
  14.       Left            =   120
  15.       Top             =   1080
  16.       _ExtentX        =   847
  17.       _ExtentY        =   847
  18.       _Version        =   393216
  19.    End
  20.    Begin VB.PictureBox picCanvas 
  21.       AutoRedraw      =   -1  'True
  22.       Height          =   4335
  23.       Left            =   960
  24.       ScaleHeight     =   285
  25.       ScaleMode       =   3  'Pixel
  26.       ScaleWidth      =   285
  27.       TabIndex        =   1
  28.       Top             =   0
  29.       Width           =   4335
  30.    End
  31.    Begin VB.CommandButton cmdGo 
  32.       Caption         =   "Go"
  33.       Default         =   -1  'True
  34.       Enabled         =   0   'False
  35.       Height          =   375
  36.       Left            =   120
  37.       TabIndex        =   0
  38.       Top             =   120
  39.       Width           =   615
  40.    End
  41.    Begin VB.Menu mnuFile 
  42.       Caption         =   "&File"
  43.       Begin VB.Menu mnuFileOpen 
  44.          Caption         =   "&Open..."
  45.          Shortcut        =   ^O
  46.       End
  47.    End
  48. End
  49. Attribute VB_Name = "frmChaos"
  50. Attribute VB_GlobalNameSpace = False
  51. Attribute VB_Creatable = False
  52. Attribute VB_PredeclaredId = True
  53. Attribute VB_Exposed = False
  54. Option Explicit
  55.  
  56. Private Running As Boolean
  57. Private NumAnchors As Integer
  58. Private AnchorX() As Single
  59. Private AnchorY() As Single
  60.  
  61. ' Draw the anchor points.
  62. Private Sub DrawAnchors()
  63. Const GAP = 2
  64.  
  65. Dim i As Integer
  66. Dim wid As Single
  67. Dim hgt As Single
  68.  
  69.     wid = picCanvas.ScaleWidth
  70.     hgt = picCanvas.ScaleHeight
  71.  
  72.     picCanvas.Cls
  73.     For i = 1 To NumAnchors
  74.         picCanvas.Line _
  75.             (wid * AnchorX(i) - GAP, hgt * AnchorY(i) - GAP)- _
  76.             Step(2 * GAP, 2 * GAP), , BF
  77.     Next i
  78. End Sub
  79. ' Load anchor point data.
  80. Private Sub LoadChaosData(ByVal file_name As String, ByVal file_title As String)
  81. Dim fnum As Integer
  82. Dim i As Integer
  83.  
  84.     fnum = FreeFile
  85.     Open file_name For Input Access Read As #fnum
  86.  
  87.     Input #fnum, NumAnchors
  88.     ReDim AnchorX(1 To NumAnchors)
  89.     ReDim AnchorY(1 To NumAnchors)
  90.     For i = 1 To NumAnchors
  91.         Input #fnum, AnchorX(i), AnchorY(i)
  92.     Next i
  93.  
  94.     Close #fnum
  95.  
  96.     DrawAnchors
  97.     Caption = "Chaos [" & file_title & "]"
  98.     cmdGo.Enabled = True
  99. End Sub
  100. ' This routine prints chaos game coordinates for
  101. ' a regular polygon. It is not used in the program,
  102. ' but I am leaving it here because you may find
  103. ' it useful.
  104. Private Sub PrintPolygonPoints(ByVal num_sides As Integer)
  105. Const PI = 3.14159265
  106.  
  107. Dim theta As Single
  108. Dim dtheta As Single
  109. Dim i As Integer
  110. Dim X As Single
  111. Dim Y As Single
  112.  
  113.     theta = -PI / 2
  114.     dtheta = 2 * PI / num_sides
  115.     For i = 1 To num_sides
  116.         X = 0.5 + 0.45 * Cos(theta)
  117.         Y = 0.5 + 0.45 * Sin(theta)
  118.         Debug.Print Format$(X, "0.00") & ", " & _
  119.             Format$(Y, "0.00")
  120.         theta = theta + dtheta
  121.     Next i
  122. End Sub
  123.  
  124. Private Sub CmdGo_Click()
  125.     If Running Then
  126.         Running = False
  127.         cmdGo.Enabled = False
  128.         cmdGo.Caption = "Stopped"
  129.     Else
  130.         Running = True
  131.         cmdGo.Caption = "Stop"
  132.         DrawAnchors
  133.         PlayGame
  134.         cmdGo.Enabled = True
  135.         cmdGo.Caption = "Go"
  136.     End If
  137. End Sub
  138.  
  139. ' Play the chaos game.
  140. Private Sub PlayGame()
  141. Dim wid As Single
  142. Dim hgt As Single
  143. Dim X As Single
  144. Dim Y As Single
  145. Dim anchor As Integer
  146. Dim i As Integer
  147.  
  148.     ' See how much room we have.
  149.     wid = picCanvas.ScaleWidth
  150.     hgt = picCanvas.ScaleHeight
  151.  
  152.     ' Pick a random starting point.
  153.     X = wid * Rnd
  154.     Y = hgt * Rnd
  155.  
  156.     ' Start the game.
  157.     i = 0
  158.     Do While Running
  159.         ' Pick a random anchor point.
  160.         anchor = Int(NumAnchors * Rnd + 1)
  161.  
  162.         ' Move halfway there.
  163.         X = (X + wid * AnchorX(anchor)) / 2
  164.         Y = (Y + hgt * AnchorY(anchor)) / 2
  165.         picCanvas.PSet (X, Y)
  166.  
  167.         ' To make things faster, only DoEvents
  168.         ' every 100 times.
  169.         i = i + 1
  170.         If i > 100 Then
  171.             i = 0
  172.             DoEvents
  173.         End If
  174.     Loop
  175. End Sub
  176. Private Sub Form_Load()
  177.     Randomize
  178.     dlgFile.Filter = "Chaos Files (*.cha)|*.cha"
  179.     dlgFile.CancelError = True
  180.     dlgFile.InitDir = App.Path
  181. End Sub
  182.  
  183. Private Sub Form_Resize()
  184. Dim wid As Single
  185.  
  186.     wid = ScaleWidth - picCanvas.Left
  187.     If wid < 120 Then wid = 120
  188.     picCanvas.Move picCanvas.Left, 0, _
  189.         wid, ScaleHeight
  190. End Sub
  191.  
  192. ' Load a chaos data file.
  193. Private Sub mnuFileOpen_Click()
  194. Dim file_name As String
  195.  
  196.     ' Allow the user to pick a file.
  197.     On Error Resume Next
  198.     dlgFile.Flags = cdlOFNFileMustExist + cdlOFNHideReadOnly
  199.     dlgFile.ShowOpen
  200.     If Err.Number = cdlCancel Then
  201.         Exit Sub
  202.     ElseIf Err.Number <> 0 Then
  203.         MsgBox "Error selecting file.", , vbExclamation
  204.         Exit Sub
  205.     End If
  206.     On Error GoTo 0
  207.  
  208.     file_name = Trim$(dlgFile.FileName)
  209.     dlgFile.InitDir = Left$(file_name, Len(file_name) _
  210.         - Len(dlgFile.FileTitle) - 1)
  211.  
  212.     ' Load the information.
  213.     LoadChaosData file_name, dlgFile.FileTitle
  214. End Sub
  215.  
  216.  
  217.